package com.jason.annotation.repeat;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * 重复注解
 * @Author: Jason
 * @Date: 16/6/11
 * @Time: 18:09
 *
 * 例如在struts2 开发中 有时需要在Action类上使用多个@Result注解. 在java8以前只能写成如下形式:
 *
 * @Result({@Result(name="failure", location="failed.jsp"),
 *          @Result(name="success", location="succ.jsp")})
 * public Acton FooAction}{....}
 *
 * 从Java8开始 上面语法可以得到简化, java8允许使用多个相同类型的Annotation来修饰同一个类,因此上面
 * 代码可能简化为如下形式
 * @Result(name="failure", location="failed.jsp")
 * @Result(name"success", location="succ.jsp")
 * public void FooAction{...}
 *
 *
 * 开发重复注解需要使用@Repeatable修饰,下面同事示例来示范如何开发重复注解
 */

// 指定该注解信息会保留到运行时
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
/**
 * 上面定义了RepeatInterface注解,该注解包含两个成员变量。但该注解默认不能作为重复注解使用,如果使用两个
 * 以上的该注解修饰同一个类,编译器会报错。
 * 为了将该注解改造成重复注解,需要使用@Repeatable修改该注解,使用@Repeatable时必须为value成员变量
 * 指定值,该成员变量的值应该是一个"容器"注解----改"容器"注解可包含多个@RepeatInterface,因此还需要定义如下的
 * "容器"注解
 */

public @interface RepeatInterface {
  /*  // 为该注解定义2个成员变量
    String name() default "Jason";
    int age();*/


    // java8中的处理方式  没有配置java8
    // 定义value成员变量,该成员变量可接受多个@RepeatInterface注解

//    RepeatInterface[] value();

}
